/*
给你单链表的头指针 head 和两个整数 left 和 right ，其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点，返回 反转后的链表 。

输入：head = [1,2,3,4,5], left = 2, right = 4
输出：[1,4,3,2,5]

输入：head = [5], left = 1, right = 1
输出：[5]
* */

//反转前面n个节点
const reverse = (head, n) => {
  if(!head) return null;
  let pre = null, cur = head;
  while (cur && n-- > 0){
    [cur.next, pre, cur] = [pre, cur, cur.next]
  }
  head.next = cur; //现在cur指向的是不需要反转的节点头了，我们把它串到我们把反转后的尾(原来的头)上
  return pre; //原来的尾 现在反转后的头
};

const reverseBetween = function (head, left, right) {
  if(!head || !head.next) return head;
  if(right === left) return head;

  let ret = new ListNode(null, head);
  let l = left;
  let pre = ret;
  while (--l){
    pre = pre.next;
  }
  //比如 left=3, 这里会移动到2

  pre.next = reverse(pre.next, right - left + 1);

  return ret.next;
};
